import router from './index'
import DashView from '@/views/DashView' // LayoutView 是架构组件，不在后台返回，在文件里单独引入
import store from '../store';
// const _import = require('./_import_' + process.env.NODE_ENV) // 获取组件的方法
const _import = require('./_import_development')

let getRouter // 用来获取后台拿到的路由
const whiteList = ['/login', '/404']; // 免登录路由白名单

router.beforeEach((to, from, next) => {
  console.log('进入路由判断目前拿到的路由表：', from.path, store.state.userStore.token)
  if (store.state.userStore.token) { // 已经登陆
    // 判断cookice是否存在 不存在即为未登录
    console.log("去:"+to.path,"出:"+from.path);
    if (to.path !== '/login') {
    console.log(store.state.userStore.initRoutes.length);
      if (store.state.userStore.initRoutes.length) {
        // 获取了动态路由 routes 一定有数据，就无需再次请求 直接放行
        console.log('完成了动态路由：', router);
        next()
      } else {
        // 没有获取动态路由,就跳转到获取动态路由的方法
        gotoRouter(to, next)
      }
    } else {
      console.log('您已经登录');
      next('/')
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      // 免登陆白名单 直接进入
      next()
    } else {
      if (to.path !== '/login') {
        // 重定向到登录页面 不能这么写 因为假如之前的角色是 管理员页面 后又登陆了非管理员 重定向的页面就可能不存在,就会导致404
        // next(`/login?redirect=${to.path}`)
        next('/login')
      } else {
        next()
      }
    }
  }
})


function gotoRouter(to, next) {
  
  getRouter = store.state.userStore.routes;// 获取store的state里的路由数据
  console.log('------路由处理之前------', getRouter)
  const sss=arrayToTree(getRouter);
  getRouter = filterAsyncRouter(sss) // 过滤路由
  console.log('过滤后的路由：', getRouter);
  store.commit('userStore/setInitRoutes', getRouter);
  router.addRoutes(getRouter) // 动态添加路由
  next({ ...to, replace: true })
}

//
function arrayToTree(items) {
  console.log(items);
  const result = []; // 存放结果集
  const itemMap = {}; //
  // 先转成map存储
  for (const item of items) {
  itemMap[item.id] = {...item, children: []}
  }

  for (const item of items) {
    const id = item.id;
    const pid = item.parentId;
    const treeItem = itemMap[id];
    if (pid === 0) {
      result.push(treeItem);
    } else {
    if (!itemMap[pid]) {
      itemMap[pid] = {
      children: [],
      }
    }
    itemMap[pid].children.push(treeItem)
    }
  }
  return result;
}




function filterAsyncRouter(asyncRouterMap) { //遍历后台传来的路由字符串，转换为组件对象
  console.log(asyncRouterMap);
  const accessedRouters = asyncRouterMap.filter(route => {
    if (route.component) {
      if (route.component === 'DashView') { // Layout组件特殊处理
        route.component = DashView
      } else {
        route.component = _import(route.component)
      }
    }
    if (route.generatemenu == 1) {
      route.hidden = true;
    }
    if (route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children)
    }
    return true
  })

  return accessedRouters
}